#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>

#define MAXN 100

using namespace std;

int map[MAXN][MAXN], N;                                                       // map[x][y]=kind表示坐标(x,y), 第kind种棋,1->帅 2->车 3->马 4->炮 5->黑帅,竖着x,横着y
int xx[] = {1, -1, 0, 0}, yy[] = {0, 0, 1, -1};                               // 车帅卒的行走方向
int mx[] = {-2, -2, -1, 1, 2, 2, 1, -1}, my[] = {1, -1, 2, 2, 1, -1, -2, -2}; // 马的行走方向

bool inScope(int x, int y) // 判断(x,y)是否在帅的活动范围内
{
    if (y < 4 || y > 6 || x < 1 || x > 3)
        return false;
    return true;
}

bool inMap(int x, int y) // 判断(x,y)是否在棋盘内
{
    if (x < 1 || x > 10 || y < 1 || y > 9)
        return false;
    return true;
}

int getNum(int x1, int y1, int x2, int y2) // 求(x1,y1)到(x2,y2)之间棋子的个数
{
    if ((x1 == x2 && y1 == y2) || (x1 != x2 && y1 != y2))
        return -1;
    if (x1 == x2)
    {
        int cnt = 0;
        if (y1 > y2)
            swap(y1, y2);
        for (int i = y1 + 1; i < y2; i++)
            if (map[x1][i])
                cnt++;
        return cnt;
    }
    if (y1 == y2)
    {
        int cnt = 0;
        if (x1 > x2)
            swap(x1, x2);
        for (int i = x1 + 1; i < x2; i++)
            if (map[i][y1])
                cnt++;
        return cnt;
    }
}

bool check(int x, int y) // 黑帅在(x,y),可以被打死返回true，不能被打死返回false
{
    for (int i = 1; i <= 10; i++)
        for (int j = 1; j <= 9; j++)
        {
            switch (map[i][j])
            {
            case 5:
                break;
            case 1: // 帅
            {
                if (getNum(x, y, i, j) == 0)
                {
                    // cout<<x<<' '<<y<<' '<<endl<<i<<' '<<j<<' '<<map[i][j]<<endl;
                    return true;
                }
                break;
            }
            case 2: // 车
            {
                if (getNum(x, y, i, j) == 0)
                {
                    // cout<<x<<' '<<y<<' '<<endl<<i<<' '<<j<<' '<<map[i][j]<<endl;
                    return true;
                }
                break;
            }
            case 4: // 炮
            {
                if (getNum(x, y, i, j) == 1)
                {
                    // cout<<x<<' '<<y<<' '<<endl<<i<<' '<<j<<' '<<map[i][j]<<endl;
                    return true;
                }
                break;
            }
            case 3: // 马
            {
                for (int dir = 0; dir < 8; dir++)
                {
                    int tx = i + mx[dir], ty = j + my[dir]; // 移动后的马坐标(tx,ty)
                    if (!inMap(tx, ty))
                        continue;
                    if (map[tx][ty] != 5)
                        continue; // 根本打不到黑帅
                    if (mx[dir] == 2)
                        if (inMap(i + 1, j) && map[i + 1][j])
                            break; // 有棋子挡道
                    if (mx[dir] == -2)
                        if (inMap(i - 1, j) && map[i - 1][j])
                            break;
                    if (my[dir] == 2)
                        if (inMap(i, j + 1) && map[i][j + 1])
                            break;
                    if (my[dir] == -2)
                        if (inMap(i, j - 1) && map[i][j - 1])
                            break;
                    // cout<<x<<' '<<y<<' '<<endl<<i<<' '<<j<<' '<<map[i][j]<<endl;
                    return true;
                }
                break;
            }
            }
        }
    return false;
}

int main()
{
    while (1)
    {
        memset(map, 0, sizeof(map));
        int hx, hy, x, y, flag = 1, now = 0; // 黑帅坐标(hx,hy),若黑帅没被将死,flag=0
        char s[3];
        scanf("%d%d%d", &N, &hx, &hy);
        if (N == 0 && hx == 0 && hy == 0)
            return 0;
        map[hx][hy] = 5;
        for (int i = 0; i < N; i++)
        {
            scanf("%s%d%d", s, &x, &y);
            switch (s[0])
            {
            case 'G':
            {
                map[x][y] = 1;
                break;
            }
            case 'R':
            {
                map[x][y] = 2;
                break;
            }
            case 'H':
            {
                map[x][y] = 3;
                break;
            }
            case 'C':
            {
                map[x][y] = 4;
                break;
            }
            }
        }
        for (int dir = 0; dir < 4; dir++)
        {
            int bak;                                  // 备份
            int tx = hx + xx[dir], ty = hy + yy[dir]; // 移动后的黑帅坐标(tx,ty)
            if (!inScope(tx, ty))
                continue;
            bak = map[tx][ty];
            map[tx][ty] = 5;
            map[hx][hy] = 0;
            if (!check(tx, ty))
            {
                flag = 0;
                break;
            } // 黑帅活下来了
            map[tx][ty] = bak;
            map[hx][hy] = 5;
        }
        if (flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}